/**
 * @file 快捷键事件监听封装
 * @description 提供类型安全的快捷键事件监听方法，避免手动拼接字符串导致的错误
 * @author AI Assistant
 * @created 2025-10-14
 */

import type { ShortcutEventMap, ShortcutEventName } from '~types/shortcut-events'

/**
 * 监听快捷键事件（类型安全）
 * @param event - 事件名称
 * @param callback - 事件回调函数
 * @returns 取消监听的函数
 *
 * @example
 * ```ts
 * // ✅ 类型安全：IDE 会提示所有可用的事件名称和参数类型
 * const unsubscribe = onShortcutEvent('cmd:find:toggle', (sourceId) => {
 *   console.log('查找切换', sourceId)
 * })
 *
 * // 取消监听
 * unsubscribe()
 * ```
 */
export function onShortcutEvent<T extends ShortcutEventName>(
  event: T,
  callback: (...args: ShortcutEventMap[T]) => void
): () => void {
  return _pre_.ipcOn(event, callback)
}

/**
 * 快捷键事件工具对象
 */
export const shortcutEvents = {
  /**
   * 监听快捷键事件
   * @param event - 事件名称
   * @param callback - 事件回调函数
   * @returns 取消监听的函数
   */
  on: onShortcutEvent,

  /**
   * 监听 ESC 按键事件
   * @param callback - 事件回调函数
   * @returns 取消监听的函数
   */
  onEscPress: (callback: (sourceId?: number) => void) => {
    return onShortcutEvent('esc:press', callback)
  },

  /**
   * 监听查找切换事件
   * @param callback - 事件回调函数
   * @returns 取消监听的函数
   */
  onFindToggle: (callback: (sourceId?: number) => void) => {
    return onShortcutEvent('cmd:find:toggle', callback)
  },
  /**
   * 打开设置
   * */
  openSettings: (callback: () => void) => {
    return onShortcutEvent('cmd:settings:open', callback)
  }
} as const
